#include "stc8h.h"
#include "../storage/storage.h"
#include "INTRINS.H"
#include "../main/configuration.h"

void iap_idle()                     //重置iap
{
    IAP_CONTR=0;                    //关闭iap
    IAP_CMD=0;                      //清除命令寄存器
    IAP_TRIG=0;                     //清除触发寄存器
    IAP_ADDRH=0x80;                 //设置地址寄存器到存储区外
    IAP_ADDRL=0;
}

void write_storage(unsigned int data addr, unsigned char data dat)              //写入eeprom（16位地址，8位数据）
{
    IAP_CONTR=0x80;                 //使能iap
    IAP_TPS=fosc/1000000;                     //设置等待参数33mhz
    IAP_CMD=2;                      //设置写命令
    IAP_ADDRL=addr;
    IAP_ADDRH=addr>>8;
    IAP_DATA=dat;
    IAP_TRIG=0x5a;                  //写触发寄存器
    IAP_TRIG=0xa5;
    _nop_();
    iap_idle();                     //关闭iap

}

char read_storage(unsigned int data addr)         //返回1字节读取数据（16位地址）
{
    unsigned char data dat;
    IAP_CONTR=0x80;
    IAP_TPS=fosc/1000000;
    IAP_CMD=1;
    IAP_ADDRL=addr;
    IAP_ADDRH=addr>>8;
    IAP_TRIG=0x5a;
    IAP_TRIG=0xa5;
    _nop_();
    dat=IAP_DATA;
    iap_idle();
    return dat;
}


void before_update(unsigned int data addr,unsigned char data dat_size)           //清除扇区并写入未更改数据
{
    unsigned char data i;
    
    unsigned char data buf[_settings_dat_count_];

    for(i=0;i<settings_addr.count;i++)              //取出未改变数据
        {
            if(settings_addr.f0.l[0].en+i==addr)
            {
                i=i+dat_size-1;
            }else{
                buf[i]=read_storage(settings_addr.f0.l[0].en+i);
            }
        }
    IAP_CONTR=0x80;                     //清除0扇区
    IAP_TPS=fosc/1000000;
    IAP_CMD=3;
    IAP_ADDRL=addr;
    IAP_ADDRH=addr>>8;
    IAP_TRIG=0x5a;
    IAP_TRIG=0xa5;
    _nop_();

    for(i=0;i<settings_addr.count;i++)      //写入未变化数据
    {
        if(settings_addr.f0.l[0].en+i==addr)
        {
            i=i+dat_size-1;
        }else{
            write_storage(settings_addr.f0.l[0].en+i,buf[i]);
        }
    }



    iap_idle();   
    
}


void factory_reset()
{
    unsigned char data i;
 //   char buf[];
    IAP_CONTR=0x80;                     //清除0扇区
    IAP_TPS=fosc/1000000;
    IAP_CMD=3;
    IAP_ADDRL=0x00;
    IAP_ADDRH=0x00;
    IAP_TRIG=0x5a;
    IAP_TRIG=0xa5;
    _nop_();

    for(i=0;i<settings_addr.count;i++)
    {
        write_storage(settings_addr.f0.l[0].en+i,read_storage(settings_addr.f0.l[0].en+i+_sector_size_));
    }
    iap_idle();
    
}